from usuarios.forms import *
from usuarios.models import *
from django.db.models import Q
from django.core.context_processors import csrf
from gestion_cuestionarios.views import *
from django.contrib.auth.models import *
from django.core.urlresolvers import reverse
from django.shortcuts import render_to_response
from django.http import HttpResponse,HttpResponseRedirect
from django.contrib.auth.decorators import login_required
from django.contrib.auth import logout, authenticate, login
from django.core.mail import send_mail
#a=UserPermisos.objects.select_related('username').get(id=1)

SEED = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456780'

def index(request):
    if "user" in request.COOKIES:
        permisos={}
        id=request.COOKIES.get("user", '')
        usuario=User.objects.get(id=id)
        userpermisos=UserPermisos.objects.get(user=usuario.id)
        permisos['issueper']=usuario.is_superuser
        permisos['isadmin']=userpermisos.admin
        permisos['isdevelp']=userpermisos.supervisor
        permisos['isdevelp']=userpermisos.experto
        username=usuario.username
        if userpermisos.admin:
            #response=render_to_response('usuarios/panel_inicial.html', {'usuario':username, 'permisos':permisos, 'userid':id
            response=HttpResponseRedirect(reverse(gestionar_usuarios))
        else: 
            response = HttpResponseRedirect(reverse(view_lista_cuestionarios))
        return response
    form=CreateForm()
    contexto={'form': form}
    contexto.update(csrf(request))
    return render_to_response('registro/registro.html',contexto)

def log_in(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        usuario = authenticate(username=username, password=password)
        if usuario is not None and usuario.is_active:
            permisos={}
            login(request, usuario)
            userpermisos=UserPermisos.objects.get(user=usuario.id)
            permisos['issueper']=usuario.is_superuser
            permisos['isadmin']=userpermisos.admin
            permisos['issup']=userpermisos.supervisor
            permisos['isexp']=userpermisos.experto            
            if permisos['isadmin']:
                #response=render_to_response('usuarios/panel_inicial.html', {'usuario':username, 
                #                                                        'permisos':permisos, 'userid':usuario.id})
                response=HttpResponseRedirect(reverse(gestionar_usuarios))
            else:
                response=HttpResponseRedirect(reverse(view_lista_cuestionarios))
            response.set_cookie("user", int(usuario.id), 365*24*60*60)
            response.set_cookie("username", usuario.username, 365*24*60*60)
            return response
        else:
            return render_to_response('usuarios/login_reintento.html',{'mensaje':'Nombre y/o contrasena incorrecta'})
    else:
        return HttpResponseRedirect('/')

@login_required
def gestionar_usuarios(request):
    if "user" in request.COOKIES:
        id=request.COOKIES.get("user", '')
        userpermisos=UserPermisos.objects.get(pk=request.COOKIES.get("user", ''))
        if userpermisos.is_admin():
            usersactivos=User.objects.filter(is_active=True)
            users=UserPermisos.objects.filter(user__in=usersactivos).select_related('username')
            numero_solicitudes=len(Solicitudes.objects.all())
            mensaje=''
            if "mensaje" in request.COOKIES:
                mensaje=request.COOKIES.get("mensaje", '')
                response=render_to_response('usuarios/gestionar_usuarios.html', {'users':users, 'userid':id, 'alta':'True', 'mensaje':mensaje,'nrosolicitudes':numero_solicitudes})
                response.delete_cookie("mensaje")
                return response
            return render_to_response('usuarios/gestionar_usuarios.html', {'users':users, 'userid':id, 'alta':'True', 'mensaje':mensaje, 'nrosolicitudes':numero_solicitudes})
    return HttpResponseRedirect('/')

@login_required
def crear_usuario(request):
    form=CreateForm()
    contexto={'form':form}
    contexto.update(csrf(request))
    return render_to_response('usuarios/nuevo_usuario.html', contexto)
    

def guardar_usuario_nuevo(request):
    if "user" in request.COOKIES:
       id=request.COOKIES.get("user", '')
    if request.method == 'POST':
        form=CreateForm(request.POST)
        if form.is_valid():
            nombre=form.cleaned_data['first_name']
            apellido=form.cleaned_data['last_name']
            username=form.cleaned_data['username']
            email=form.cleaned_data['email']
            password=form.cleaned_data['password1']
            nuevo_usuario=User(first_name=nombre,
                               last_name=apellido,
                                username=username,
                                email=email,
                                )
            nuevo_usuario.set_password(password)            
            nuevo_usuario.save()
            persmisos=UserPermisos(user=nuevo_usuario, admin=False, supervisor=False, experto=False)
            persmisos.save()
            if "user" in request.COOKIES:
                id=request.COOKIES.get("user", '')
                return HttpResponseRedirect(reverse(gestionar_usuarios))
            else:
                return render_to_response('usuarios/login_reintento.html',{'mensaje':'Su usuario ha sido creado'})
    contexto={'form':form}
    contexto.update(csrf(request))
    
    return render_to_response('usuarios/nuevo_usuario.html', contexto)

@login_required    
def guardar_usuario_existente(request):
    if "user" in request.COOKIES:
        idconectado=request.COOKIES.get("user", '')
        permisosconectado=UserPermisos.objects.get(user=idconectado)
    else:            
        return HttpResponseRedirect('/')
    if request.method == 'POST':
        username = request.POST['username']
        usuario=User.objects.get(username=username)
        form=EditForm(request.POST, instance=usuario)
        if form.is_valid():
            form.save()
        if permisosconectado.is_admin():
            permisos=UserPermisos.objects.get(user=usuario.id)
            permisos=PermisosForm(request.POST, instance=permisos)
            if permisos.is_valid():
                permisos.save()
                return HttpResponseRedirect('/gestionar_usuarios/')
        else: 
            return HttpResponseRedirect(reverse(view_lista_cuestionarios))
        contexto={'form':form}
        contexto.update(csrf(request))
    return render_to_response('usuarios/nuevo_usuario.html', contexto)

@login_required    
def editar_usuario(request, id):
    contexto={}
    if "user" in request.COOKIES:
        idautenticado=request.COOKIES.get("user", '')
        userpermisos=UserPermisos.objects.get(pk=idautenticado)
        if userpermisos.is_admin():
            permisos=UserPermisos.objects.get(id=id)
            permisoform=PermisosForm(instance=permisos)
            contexto['permisosform']=permisoform
    usuario=User.objects.get(id=id)
    username=usuario.username
    form=EditForm(instance=usuario)
    contexto['form']=form
    contexto['username']=username
    contexto['admin']=userpermisos.is_admin()
    contexto['experto']=userpermisos.is_experto()
    contexto['supervisor']=userpermisos.is_supervisor()
    pendiente=Solicitudes.objects.filter(user=id)
    contexto['pendiente']=pendiente.exists()
        
    return render_to_response('usuarios/editar_usuario.html', contexto)
    
def cambiar_password(request):
    form=CambiarPassForm()
    contexto={'form':form}
    contexto.update(csrf(request))
    return render_to_response('usuarios/cambiar_contrasena.html', {'form':form})

def guardar_nuevo_password(request):
    if "user" in request.COOKIES:
        idautenticado=request.COOKIES.get("user", '')
    if request.method == 'POST':
        form=CambiarPassForm(request.POST)
        user=User.objects.get(pk=idautenticado)
        if form.is_valid():
            passviejo=form.cleaned_data['passwordviejo']
            usuario=authenticate(username=user.username, password=passviejo)
            if usuario:
                password=form.cleaned_data['password1']
                user.set_password(password)
                user.save()
                return HttpResponseRedirect(reverse(view_lista_cuestionarios))
            else:
                return HttpResponseRedirect(reverse(cambiar_password))          
        else:
             return HttpResponseRedirect(reverse(cambiar_password))
                
                
@login_required
def borrar_usuario(request):
    if "user" in request.COOKIES:
        userpermisos=UserPermisos.objects.get(pk=request.COOKIES.get("user", ''))
        if userpermisos.is_admin():
            if request.method == 'GET':
                id=request.GET.get('iduser', ' ')
                if id:
                    usuario=User.objects.get(id=id)
                    usuario.is_active=False
                    usuario.save()
                    response=HttpResponseRedirect('/gestionar_usuarios/')
                    response.set_cookie("mensaje", "El usuario se ha dado de baja", 60)
                    return response
                else:
                    response=HttpResponseRedirect('/gestionar_usuarios/')
                    response.set_cookie("mensaje", "Ocurrio un error al dar de baja al usuario", 60)
                    return response
        return HttpResponseRedirect(reverse(view_lista_cuestionarios))
    else:
        HttpResponseRedirect('/')

@login_required  
def log_out(request):
    response = HttpResponseRedirect('/')
    if "user" in request.COOKIES:
        response.delete_cookie("user")
        if "sessionid" in request.COOKIES:
            response.delete_cookie("sessionid")
        if "username" in request.COOKIES:
            response.delete_cookie("username")
        if "sesid" in request.COOKIES:
            response.delete_cookie("sesid")
    logout(request)
    return response

def reset_pass_html(request):
    return render_to_response('usuarios/recuperarpass.html')

def random_pass(chars, length):
    import random,string
    return "".join( random.sample( chars*length, length ))  

def reset_pasword(request):
    if request.method == 'POST':
        email= request.POST['mail']
        user=User.objects.filter(email=email)
        if user:
            new_pass = random_pass(SEED,8)
            user_new_pass = User.objects.get(username=user[0].username)
            user_new_pass.set_password(new_pass) 
            user_new_pass.save()
            #send_mail("Recovery solicitado por el usuario","El equipo de EUP te envia tus datos para poder acceder a nuestro sistema\nUser:%s\nPassword:%s\nEntra a editar perfil para cambiar tu password.\n\nEl equipo de EUP."%(user[0].username,new_pass),'enduserprogrammin@gmail.com',[user[0].email], fail_silently=False)
            return render_to_response('usuarios/login_reintento.html')

@login_required           
def listar_usuario_baja(request):
    if "user" in request.COOKIES:
        id=request.COOKIES.get("user", '')
        usersactivos=User.objects.filter(is_active=False)
        users=UserPermisos.objects.filter(user__in=usersactivos).select_related('username')
        #users=UserPermisos.objects.filter(pk__in=usersactivos).select_related('username')
        response=render_to_response('usuarios/gestionar_usuarios.html', {'users':users, 'userid':id})
        return response
    return HttpResponseRedirect('/')

@login_required
def dar_alta_usuario(request, id):
    if "user" in request.COOKIES:
        userpermisos=UserPermisos.objects.get(pk=request.COOKIES.get("user", ''))
        if userpermisos.is_admin():
            usuario=User.objects.get(id=id)
            usuario.is_active=True
            usuario.save()
            response=HttpResponseRedirect('/gestionar_usuarios/')
            response.set_cookie("mensaje", "El usuario se ha reactivado", 60)
            return response
        return HttpResponseRedirect(reverse(view_lista_cuestionarios))
    else:
        HttpResponseRedirect('/')
        
@login_required
def gestionar_solicitudes(request):
    if "user" in request.COOKIES:
        userpermisos=UserPermisos.objects.get(pk=request.COOKIES.get("user", ''))
        if userpermisos.is_admin():
            solicitudes= Solicitudes.objects.all().select_related('username')
            return render_to_response('usuarios/gestionar_solicitudes.html', {'solicitudes':solicitudes})
        return HttpResponseRedirect(reverse(view_lista_cuestionarios))
    else:
       return HttpResponseRedirect('/')

       
@login_required
def enviar_solicitud(request, tipo_solicitud):
    tipo_solicitud=int(tipo_solicitud)
    if "user" in request.COOKIES:
        user=User.objects.get(pk=request.COOKIES.get("user", ''))
        solicitud=Solicitudes()
        solicitud.user=user
        if(tipo_solicitud==1):
            solicitud.experto=True
        elif(tipo_solicitud==2):
            solicitud.supervisor=True
        solicitud.save()
        response=HttpResponseRedirect(reverse(view_lista_cuestionarios))
        response.set_cookie("mensaje", "La solicitud ha sido enviada", 60)
        return response
    return HttpResponseRedirect('/')

@login_required    
def rechazar_solicitud(request, id):
    id=int(id)
    solicitud=Solicitudes.objects.get(pk=id)
    if solicitud.solicitud_supervisor():
        tipo_solicitud='supervisor'
    elif solicitud.solicitud_experto():
        tipo_solicitud='experto'
    user=User.objects.get(pk=solicitud.user_id)
    email=user.email
    #send_mail("Solicitud Rechazada","El equipo de EUP te comunica que tu solicitud de trabajar como %s ha sido RECHAZADA"%(tipo_solicitud),'enduserprogrammin@gmail.com', [email], fail_silently=False)
    solicitud.delete()
    response=HttpResponseRedirect(reverse(gestionar_usuarios))
    response.set_cookie("mensaje", "La solicitud ha sido rechazada", 60)
    return response


@login_required    
def aceptar_solicitud(request, id):
    solicitud=Solicitudes.objects.get(pk=id)
    permisos=UserPermisos.objects.get(user=solicitud.user_id)
    user=User.objects.get(pk=solicitud.user_id)
    email=user.email
    if solicitud.solicitud_supervisor():
        tipo_solicitud='supervisor'
        permisos.experto=False
        permisos.supervisor=True
    elif solicitud.solicitud_experto():
        tipo_solicitud='experto'
        permisos.supervisor=False
        permisos.experto=True
    permisos.save()
    #send_mail("Solicitud Aceptada","El equipo de EUP te comunica que tu solicitud de trabajar como %s ha sido ACEPTADA"%(tipo_solicitud),'enduserprogrammin@gmail.com', [email], fail_silently=False)
    solicitud.delete()
    response=HttpResponseRedirect(reverse(gestionar_usuarios))
    response.set_cookie("mensaje", "La solicitud ha sido aceptada", 60)
    return response